// <copyright file="IArea.cs" company="City of Portland, BES-ASM">
// </copyright>
// <summary>IArea interface</summary>

namespace BESASM.EMGAATS.BusinessClasses
{
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;

  /// <summary>
  /// Represents an area
  /// </summary>
  public interface IArea : IEntity
  {
    /// <summary>
    /// Gets or sets the polygon geometry representing this area
    /// </summary>
    IPolygon Geometry { get; set; }

    /// <summary>
    /// Gets or sets the enumerated area type
    /// </summary>
    AreaType AreaType { get; set; }
    
    /// <summary>
    /// Gets or sets the area, in square feet
    /// </summary>
    int AreaSqFt { get; set; }

    /// <summary>
    /// Gets or sets the sanitary flow generated by the area, in cubic feet per second
    /// </summary>
    double SanitaryFlowCfs { get; set; }

    /// <summary>
    /// Gets or sets the flow length for this area in feet
    /// </summary>
    double FlowLengthFt { get; set; }

    /// <summary>
    /// Gets or sets the slope for this area as rise over run ratio (ft/ft)
    /// </summary>
    double SlopeFtPerFt { get; set; }

    /// <summary>
    /// Gets or sets the default node where overland flow from the Area will drain to
    /// </summary>
    INode OverlandFlowDestination { get; set; }
 
    /// <summary>
    /// Gets the list of Directors assigned to the Area
    /// </summary>
    IList<IDirector> Directors { get; }

    /// <summary>
    /// Gets a value indicating whether the Area has a Director
    /// </summary>
    bool HasDirector { get; }

    /// <summary>
    /// Gets the amount of undirected area
    /// </summary>
    int RemainingAreaSqFt { get; }

    /// <summary>
    /// Gets a value indicating whether directors have over-allocated area
    /// </summary>
    bool ExcessAreaAllocated { get; }

    /// <summary>
    /// Gets a list of  directors and the corresponding amount of area in excess of the available area
    /// </summary>
    List<ExcessDirectorItem> ExcessDirectorList { get; }

    /// <summary>
    /// Adds a director reference to the Area
    /// </summary>
    /// <param name="director">The director to be added</param>
    void AddDirector(IDirector director);

    /// <summary>
    /// Removes a director reference from the Area
    /// </summary>
    /// <param name="director">The director to remove</param>
    void RemoveDirector(IDirector director);
  }
}
